﻿//BMCW.Common
(function ($, layer) {
    "use strict";
    var win = window,
        doc = document,
        objectPrototype = Object.prototype,
        toString = objectPrototype.toString;

    win.BMCW = win.BMCW || {};
    $.extend(BMCW, {
        /**
		 * 版本号
		 * @type {Number}
		 */
        version: "3.3.1",
        /**
		 * 是否为函数
		 * @param  {*} fn 对象
		 * @return {Boolean}  是否函数
		 */
        isFunction: function (fn) {
            return typeof fn === "function";
        },
        /**
		 * 是否数组
		 * @method
		 * @param  {*}  obj 是否数组
		 * @return {Boolean}  是否数组
		 */
        isArray: "isArray" in Array ? Array.isArray : function (value) {
            return toString.call(value) === "[object Array]";
        },
        /**
		 * 是否日期
		 * @param  {*}  value 对象
		 * @return {Boolean}  是否日期
		 */
        isDate: function (value) {
            return toString.call(value) === "[object Date]";
        },
        /**
		 * 是否是javascript对象
		 * @param {Object} value The value to test
		 * @return {Boolean}
		 * @method
		 */
        isObject: toString.call(null) === "[object Object]" ? function (value) {
            return value !== null && value !== undefined && toString.call(value) === "[object Object]" && value.ownerDocument === undefined;
        } : function (value) {
            return toString.call(value) === "[object Object]";
        },
        /**
		 * 是否是数字或者数字字符串
		 * @param  {String}  value 数字字符串
		 * @return {Boolean}  是否是数字或者数字字符串
		 */
        isNumeric: function (value) {
            return !isNaN(parseFloat(value)) && isFinite(value);
        },
        /**
		 * 是否字符串
		 * @param {String} value
		 * @return {Boolean} 
		 */
        isString: function (value) {
            return typeof value === "string";
        },
        /**
		 * 是否数字
		 * @param {Number} value
		 * @return {Boolean} 
		 */
        isNumber: function (value) {
            return typeof value === "number";
        },
        /**
		 * 是否bool类型
		 * @param {Boolean} value
		 * @return {Boolean} 
		 */
        isBoolean: function (value) {
            return typeof value === "boolean";
        },
        /**
		 * 是否为空
		 * @param {Object} value
		 * @return {Boolean} 
		 */
        isNullOrEmpty: function (value) {
            if (value) {
                value = value.toString().replace(/(^\s*)|(\s*$)/g, "");
                if (value == "null" || value == "") {
                    return true;
                } else {
                    return false;
                }
            } else {
                if (value === 0 || value === false) {
                    return false;
                }
                return true;
            }
        },
        /**
		 * 将s1的属性或方法复制到r的原型链上面
		 * @param {Function} 目标函数
		 * @param {[Function]} 待复制函数列表
		 */
        augment: function (r, s1) {
            if (!BMCW.isFunction(r)) {
                return r;
            }
            for (var i = 1; i < arguments.length; i++) {
                BMCW.mix(r.prototype, arguments[i].prototype || arguments[i]);
            }
            return r;
        },
        /**
		 * 拷贝对象
		 * @param  {Object} obj 要拷贝的对象
		 * @return {Object} 拷贝生成的对象
		 */
        cloneObject: function (obj) {
            var result = BMCW.isArray(obj) ? [] : {};
            return BMCW.mix(true, result, obj);
        },
        /**
		 * 抛出异常
		 * @param {String} 错误消息
		 */
        error: function (msg) {
            if (BMCW.debug) {
                throw new Error(msg);
            }
        },
        /**
         * 添加日志
         * @param {Object} obj
         */
        log: function (obj) {
            if (BMCW.debug && win.console && win.console.log) {
                win.console.log(obj);
            }
        },
        /**
         * 将多个对象的属性复制到一个新的对象
         */
        merge: function () {
            var args = $.makeArray(arguments),
                first = args[0];
            if (BMCW.isBoolean(first)) {
                args.shift();
                args.unshift({});
                args.unshift(first);
            } else {
                args.unshift({});
            }
            return BMCW.mix.apply(null, args);
        },
        /**
         * 封装 jQuery.extend 方法，将两个或更多对象的内容合并到第一个对象
         */
        mix: function () {
            return $.extend.apply(null, arguments);
        },
        /**
         * 替换字符串中的字段
         * @param {Object} 模版字符串
         * @param {Object} JSON对象
         * @param {Object} 替换正则
         */
        substitute: function (str, o, regexp) {
            if (!BMCW.isString(str) || !BMCW.isObject(o) && !BMCW.isArray(o)) {
                return str;
            }
            return str.replace(regexp || /\\?\{([^{}]+)\}/g, function (match, name) {
                if (match.charAt(0) === "\\") {
                    return match.slice(1);
                }
                return o[name] === undefined ? "" : o[name];
            });
        },
        /**
         * 将url参数转换成对象
         * @param {Object} str
         */
        unparam: function (str) {
            if (typeof str != "string" || !(str = $.trim(str))) {
                return {};
            }
            var pairs = str.split("&"),
                pairsArr, rst = {};
            for (var i = pairs.length - 1; i >= 0; i--) {
                pairsArr = pairs[i].split("=");
                rst[pairsArr[0]] = decodeURIComponent(pairsArr[1]);
            }
            return rst;
        },
        /**
         * 首字母大写
         * @param {Object} s
         */
        ucfirst: function (s) {
            s += "";
            return s.charAt(0).toUpperCase() + s.substring(1);
        },
        /**
         * 遍历数组执行func参数
         * @param {Object} elements
         * @param {Object} func
         */
        each: function (elements, func) {
            if (!elements) {
                return;
            }
            $.each(elements, function (k, v) {
                return func(v, k);
            });
        },
        /**
        * 判断是否为手机号码
        */
        isMoile: function (mobile) {
            var re = /^1[3456789]\d{9}$/;
            return re.test(mobile);
        },
        /**
        * 获取查询字符串变量
        */
        getQueryString: function (name) {
            var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
            var r = window.location.search.substr(1).match(reg);
            if (r != null) return decodeURIComponent(r[2]);
            return null;
        },
        /**
        * 是否微信浏览器
        */
        isWeiXin: function () {
            var ua = window.navigator.userAgent.toLowerCase();
            if (ua.match(/MicroMessenger/i) == 'micromessenger') {
                return true;
            } else {
                return false;
            }
        },
        /**
        * 组合成时间字符串
        * @param {String} y 年
        * @param {String} m 月
        * @param {String} d 日
        */
        combineDateStr: function (y, m, d) {
            if (parseInt(m) < 10) {
                m = "0" + m;
            }
            if (parseInt(d) < 10) {
                d = "0" + d;
            }
            return y + '-' + m + '-' + d;
        },
        /**
        * 异步加载javascript模块
        */
        loadScript: function (url, callback, charset) {
            var s = document.createElement("script");
            s.type = "text/javascript";
            charset && (s.charset = charset);
            if (s.readyState) {
                s.attachEvent("onreadystatechange",
                    function () {
                        if (s.readyState == "loaded" || s.readyState == "complete") {
                            s.detachEvent('onreadystatechange', arguments.callee);
                            callback && callback();
                        }
                    });
            } else {
                s.onload = function () {
                    callback && callback();
                };
            }
            s.src = url;
            document.getElementsByTagName("head")[0].appendChild(s);
        },
        /**
        * toast轻提示
        */
        toast: function (content, time, skin) {
            //var obj = {
            //    content: content,
            //    skin: skin || "msg",
            //    time: time || 2 //2秒后自动关闭
            //};
            //layer.open(obj);

        },
        /**
        * info信息框
        */
        alert: function (msg) {
            var layer = top.layer || window.layer || window;
            layer.alert(msg, { btnAlign: 'c' });
        },
        msg: function (msg, callback) {
            var layer = top.layer || window.layer;
            var time = 2000;
            layer.msg(msg, {
                icon: 1,
                time: time, //2秒关闭（如果不配置，默认是3秒）
                shade: [0.5, '#000', true]
            }, function () {
               // BMCW.closeTopLayer();
                callback();

            })
        },
        DataConfirm: function (msg, callback) {
            var str = '确认要删除此数据吗？';
            if (msg != null && msg != '') {
                str = msg;
            }
            var layer = top.layer || window.layer;
            layer.confirm(str, {
                btn: ['确认', '取消'] //可以无限个按钮
            }, function (index, layero) {
                callback();
            });
        },
        /**
          * 加载中
          */
        loading: function (content) {
            top.layer.load(0, { shade: [0.7, '#393D49'] }, { shadeClose: true });
        },
        /**
         * 关闭
         */
        closeAll: function () {
            top.layer.closeAll();
        },
        //在框架最顶层弹出层
        showTopLayer: function (titleName, url, mwidth, mheight, otherOpts) {
            mwidth = mwidth || 900;
            //mwidth = Math.max(mwidth, 400);
            mheight = mheight || 550;
            //mheight = Math.max(mheight, 350);
            var settings = {
                type: 2,
                title: titleName,
                maxmin: true,
                //shadeClose: true, //点击遮罩关闭层
                area: [mwidth + 'px', mheight + 'px'],
                content: [url], //[url,'no']
                resize: true //是否允许拉伸
            };
            if (otherOpts && $.isPlainObject(otherOpts)) {
                settings = $.extend(settings, otherOpts);
            }
            var index = top.layer.open(settings);
            top.window.currentLayerIndex = index;
            return index;
        },
        getTopSelectedWin: function () {
            return top.$("#menuFrame")[0].contentWindow;
        },
        /**
		 * @description 格式化日期
		 * @param {Date} datetimeObj
		 * @param {string} fmt
		 * @example
		 * common.formatDate("2015-01-01","yyyy-MM-dd");
		 */
        formatDate: function (datetimeObj, fmt) { //author: meizz 
            if (BMCW.isString(datetimeObj)) {
                if (datetimeObj.length > 19) {
                    datetimeObj = datetimeObj.substring(0, 19)
                }
                datetimeObj = datetimeObj.replace('T', ' ').replace(/-/g, '/'); //ios不支持yyyy-MM-dd
                var ms = Date.parse(datetimeObj);
                datetimeObj = new Date(ms);
            }
            var o = {
                "M+": datetimeObj.getMonth() + 1, //月份 
                "d+": datetimeObj.getDate(), //日 
                "h+": datetimeObj.getHours() % 12 == 0 ? 12 : datetimeObj.getHours() % 12, //12进制小时 
                "H+": datetimeObj.getHours(), //24进制小时 
                "m+": datetimeObj.getMinutes(), //分 
                "s+": datetimeObj.getSeconds(), //秒 
                "q+": Math.floor((datetimeObj.getMonth() + 3) / 3), //季度 
                "S": datetimeObj.getMilliseconds() //毫秒 
            };
            if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (datetimeObj.getFullYear() + "").substr(4 - RegExp.$1.length));
            for (var k in o)
                if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
            return fmt;
        },
        /**
        * @description ajax请求
        * @param {object} option
        * @example
        * common.ajax({url:"www.baidu.com",type:"Get",success:function(){}});
        */
        ajax: function (option) {
            if (!option) {
                console.log("bmcw.ajax缺少必要的所有参数");
                return false;
            }

            //由于编程不规范,导致post Post POST各种情况，统一大写
            option.type = option.type || "GET";
            option.type = option.type.toUpperCase();
            if (option.type == "POST") {
                option.data = JSON.stringify(option.data);
            }
            var a = {
                url: option.url || "",
                type: option.type,
                async: option.async || true,
                data: option.data || {},
                dataType: option.dataType || "json",
                headers: option.headers || null,
                contentType: option.contentType || "application/json",
                timeout: option.timeout || null,
                beforeSend: option.beforeSend || null,
                complete: option.complete || function () { },
                success: option.success || null,
                error: option.error || null,
            }
            $.ajax(a);
        },
        /**
        * 获取表单内容 json格式
        */
        seariallizeJson: function (formid) {
            var obj = {};
            var fields = $("#" + formid).serializeArray();
            jQuery.each(fields, function (i, fields) {
                if (o[this.name]) {
                    /*
                    表单中可能有多个相同标签，比如有多个label，
                    那么你在json对象o中插入第一个label后，还要继续插入，
                    那么这时候o[label]在o中就已经存在，所以你要把o[label]做嵌套数组处理
                    */
                    //如果o[label]不是嵌套在数组中
                    if (!obj[this.name].push) {
                        obj[this.name] = [o[this.name]];  // 将o[label]初始为嵌套数组，如o={a,[a,b,c]}
                    }
                    obj[this.name].push(this.value || ''); // 将值插入o[label]
                } else {
                    obj[this.name] = this.value || '';  // 第一次在o中插入o[label]
                }
            });
            return obj;
        }
    });

})(jQuery, document);


(function ($) {
    /**
     * 将form里面的内容序列化成json
     * 相同的checkbox用分号拼接起来
     * @param {dom} 指定的选择器
     * @param {obj} 需要拼接在后面的json对象
     * @method serializeJson
     * */
    $.fn.serializeJson = function (otherString) {
        var serializeObj = {},
            array = this.serializeArray();
        $(array).each(function () {
            if (serializeObj[this.name]) {
                serializeObj[this.name] += ';' + this.value;
            } else {
                serializeObj[this.name] = this.value;
            }
        });

        if (otherString != undefined) {
            var otherArray = otherString.split(';');
            $(otherArray).each(function () {
                var otherSplitArray = this.split(':');
                serializeObj[otherSplitArray[0]] = otherSplitArray[1];
            });
        }
        return serializeObj;
    };
})(jQuery);

//BMCW.MD5
(function (n) {
    "use strict";

    function t(n, t) {
        var r = (65535 & n) + (65535 & t),
            e = (n >> 16) + (t >> 16) + (r >> 16);
        return e << 16 | 65535 & r
    }

    function r(n, t) {
        return n << t | n >>> 32 - t
    }

    function e(n, e, o, u, c, f) {
        return t(r(t(t(e, n), t(u, f)), c), o)
    }

    function o(n, t, r, o, u, c, f) {
        return e(t & r | ~t & o, n, t, u, c, f)
    }

    function u(n, t, r, o, u, c, f) {
        return e(t & o | r & ~o, n, t, u, c, f)
    }

    function c(n, t, r, o, u, c, f) {
        return e(t ^ r ^ o, n, t, u, c, f)
    }

    function f(n, t, r, o, u, c, f) {
        return e(r ^ (t | ~o), n, t, u, c, f)
    }

    function i(n, r) {
        n[r >> 5] |= 128 << r % 32, n[(r + 64 >>> 9 << 4) + 14] = r;
        var e, i, a, h, d, l = 1732584193,
            g = -271733879,
            v = -1732584194,
            m = 271733878;
        for (e = 0; e < n.length; e += 16) i = l, a = g, h = v, d = m, l = o(l, g, v, m, n[e], 7, -680876936), m = o(m, l, g, v, n[e + 1], 12, -389564586), v = o(v, m, l, g, n[e + 2], 17, 606105819), g = o(g, v, m, l, n[e + 3], 22, -1044525330), l = o(l, g, v, m, n[e + 4], 7, -176418897), m = o(m, l, g, v, n[e + 5], 12, 1200080426), v = o(v, m, l, g, n[e + 6], 17, -1473231341), g = o(g, v, m, l, n[e + 7], 22, -45705983), l = o(l, g, v, m, n[e + 8], 7, 1770035416), m = o(m, l, g, v, n[e + 9], 12, -1958414417), v = o(v, m, l, g, n[e + 10], 17, -42063), g = o(g, v, m, l, n[e + 11], 22, -1990404162), l = o(l, g, v, m, n[e + 12], 7, 1804603682), m = o(m, l, g, v, n[e + 13], 12, -40341101), v = o(v, m, l, g, n[e + 14], 17, -1502002290), g = o(g, v, m, l, n[e + 15], 22, 1236535329), l = u(l, g, v, m, n[e + 1], 5, -165796510), m = u(m, l, g, v, n[e + 6], 9, -1069501632), v = u(v, m, l, g, n[e + 11], 14, 643717713), g = u(g, v, m, l, n[e], 20, -373897302), l = u(l, g, v, m, n[e + 5], 5, -701558691), m = u(m, l, g, v, n[e + 10], 9, 38016083), v = u(v, m, l, g, n[e + 15], 14, -660478335), g = u(g, v, m, l, n[e + 4], 20, -405537848), l = u(l, g, v, m, n[e + 9], 5, 568446438), m = u(m, l, g, v, n[e + 14], 9, -1019803690), v = u(v, m, l, g, n[e + 3], 14, -187363961), g = u(g, v, m, l, n[e + 8], 20, 1163531501), l = u(l, g, v, m, n[e + 13], 5, -1444681467), m = u(m, l, g, v, n[e + 2], 9, -51403784), v = u(v, m, l, g, n[e + 7], 14, 1735328473), g = u(g, v, m, l, n[e + 12], 20, -1926607734), l = c(l, g, v, m, n[e + 5], 4, -378558), m = c(m, l, g, v, n[e + 8], 11, -2022574463), v = c(v, m, l, g, n[e + 11], 16, 1839030562), g = c(g, v, m, l, n[e + 14], 23, -35309556), l = c(l, g, v, m, n[e + 1], 4, -1530992060), m = c(m, l, g, v, n[e + 4], 11, 1272893353), v = c(v, m, l, g, n[e + 7], 16, -155497632), g = c(g, v, m, l, n[e + 10], 23, -1094730640), l = c(l, g, v, m, n[e + 13], 4, 681279174), m = c(m, l, g, v, n[e], 11, -358537222), v = c(v, m, l, g, n[e + 3], 16, -722521979), g = c(g, v, m, l, n[e + 6], 23, 76029189), l = c(l, g, v, m, n[e + 9], 4, -640364487), m = c(m, l, g, v, n[e + 12], 11, -421815835), v = c(v, m, l, g, n[e + 15], 16, 530742520), g = c(g, v, m, l, n[e + 2], 23, -995338651), l = f(l, g, v, m, n[e], 6, -198630844), m = f(m, l, g, v, n[e + 7], 10, 1126891415), v = f(v, m, l, g, n[e + 14], 15, -1416354905), g = f(g, v, m, l, n[e + 5], 21, -57434055), l = f(l, g, v, m, n[e + 12], 6, 1700485571), m = f(m, l, g, v, n[e + 3], 10, -1894986606), v = f(v, m, l, g, n[e + 10], 15, -1051523), g = f(g, v, m, l, n[e + 1], 21, -2054922799), l = f(l, g, v, m, n[e + 8], 6, 1873313359), m = f(m, l, g, v, n[e + 15], 10, -30611744), v = f(v, m, l, g, n[e + 6], 15, -1560198380), g = f(g, v, m, l, n[e + 13], 21, 1309151649), l = f(l, g, v, m, n[e + 4], 6, -145523070), m = f(m, l, g, v, n[e + 11], 10, -1120210379), v = f(v, m, l, g, n[e + 2], 15, 718787259), g = f(g, v, m, l, n[e + 9], 21, -343485551), l = t(l, i), g = t(g, a), v = t(v, h), m = t(m, d);
        return [l, g, v, m]
    }

    function a(n) {
        var t, r = "";
        for (t = 0; t < 32 * n.length; t += 8) r += String.fromCharCode(n[t >> 5] >>> t % 32 & 255);
        return r
    }

    function h(n) {
        var t, r = [];
        for (r[(n.length >> 2) - 1] = void 0, t = 0; t < r.length; t += 1) r[t] = 0;
        for (t = 0; t < 8 * n.length; t += 8) r[t >> 5] |= (255 & n.charCodeAt(t / 8)) << t % 32;
        return r
    }

    function d(n) {
        return a(i(h(n), 8 * n.length))
    }

    function l(n, t) {
        var r, e, o = h(n),
            u = [],
            c = [];
        for (u[15] = c[15] = void 0, o.length > 16 && (o = i(o, 8 * n.length)), r = 0; 16 > r; r += 1) u[r] = 909522486 ^ o[r], c[r] = 1549556828 ^ o[r];
        return e = i(u.concat(h(t)), 512 + 8 * t.length), a(i(c.concat(e), 640))
    }

    function g(n) {
        var t, r, e = "0123456789abcdef",
            o = "";
        for (r = 0; r < n.length; r += 1) t = n.charCodeAt(r), o += e.charAt(t >>> 4 & 15) + e.charAt(15 & t);
        return o
    }

    function v(n) {
        return unescape(encodeURIComponent(n))
    }

    function m(n) {
        return d(v(n))
    }

    function p(n) {
        return g(m(n))
    }

    function s(n, t) {
        return l(v(n), v(t))
    }

    function C(n, t) {
        return g(s(n, t))
    }

    function A(n, t, r) {
        return t ? r ? s(t, n) : C(t, n) : r ? m(n) : p(n)
    }

    n.md5 = A;
})(window.BMCW);

/*
    DES helper
*/

(function($,win) {
    var BMCW=win.BMCW = win.BMCW || {};
    $.extend(BMCW, {
        desKey: "FGYLFGYL",
        /**
         * Des加密数据
         * @param {加密数据内容} data 
         * @returns {} 
         */
        desEncrypt: function (data) {
            var key = BMCW.desKey;
            
            var keyHex = CryptoJS.enc.Latin1.parse(key);
            var ivHex = CryptoJS.enc.Latin1.parse(key);
            var encrypted = CryptoJS.DES.encrypt(data, keyHex, {
                    iv: ivHex,
                    mode: CryptoJS.mode.CBC,
                    padding: CryptoJS.pad.Pkcs7
                }
            );
            var result =CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
            return result;

        },
        /**
         * Des解密数据
         * @param {} data 
         * @returns {} 
         */
        desDecrypt:function(data) {
            var key = BMCW.desKey;
            var content = CryptoJS.enc.Base64.parse(data);
            //content = content.toString(CryptoJS.enc.Utf8);
          
            var keyHex = CryptoJS.enc.Latin1.parse(key);
            var ivHex = CryptoJS.enc.Latin1.parse(key);

            var decrypted = CryptoJS.DES.decrypt({
                ciphertext:content
            }, keyHex, {
                iv: ivHex,
                mode: CryptoJS.mode.CBC,
                padding: CryptoJS.pad.Pkcs7
            }
            );
            var szResult = decrypted.toString(CryptoJS.enc.Utf8);
            return szResult;
        }
    });
})(jQuery, window);
